- 注册时间
- 2007-12-28
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 12785
- 在线时间
- 小时
|
楼主 |
发表于 2009-2-4 21:06:06
|
显示全部楼层
我这里给出一个不是用 MMX和XMM指令的版本,使用跳表实现。因为VC中不可以定义标号的地址。故不得不使用汇编文件。
在VC6.0,对于汇编文件,可以自定义build命令,在编译期间同时编译asm文件,为此,你需要
1。安装masm32
2. 在VC 中,设置 executable files 目录,指向ml.exe, 比如我的masm32 安装在 c:\masm32,因此executable files目录中添加 C:\masm32\BIN
3. 在VC中,将asm文件添加到project.并选中那个asm文件,设置Custom Build
Commands 框填入: ml /coff /c $(InputPath)
outputs 框填入: $(InputName).obj
下面先给出cpp文件中的测试代码:- extern "C" _fastcall int digLen(int n);
- void digLenTest()
- {
- unsigned long n;
-
- n=1;
- printf("diglen(%u)=%d\n",n,digLen(n));
- n=7;
- printf("diglen(%u)=%d\n",n,digLen(n));
-
- n=8;
- printf("diglen(%u)=%d\n",n,digLen(n));
- n=9;
- printf("diglen(%u)=%d\n",n,digLen(n));
- n=10;
- printf("diglen(%u)=%d\n",n,digLen(n));
- n=99;
- printf("diglen(%u)=%d\n",n,digLen(n));
-
- n=100;
- printf("diglen(%u)=%d\n",n,digLen(n));
- n=1000;
- printf("diglen(%u)=%d\n",n,digLen(n));
-
- n=9999;
- printf("diglen(%u)=%d\n",n,digLen(n));
- n=10000;
- printf("diglen(%u)=%d\n",n,digLen(n));
-
- n=99999;
- printf("diglen(%u)=%d\n",n,digLen(n));
- n=100000;
- printf("diglen(%u)=%d\n",n,digLen(n));
- }
复制代码 再给出汇编文件中的代码:-
- .486P
- .387
- OPTION DOTNAME
- _TEXT SEGMENT DWORD PUBLIC FLAT 'CODE'
- ALIGN 004H
- _TEXT ENDS
-
- _DATA SEGMENT DWORD PUBLIC FLAT 'DATA'
- ALIGN 004H
- _DATA ENDS
-
- _BSS SEGMENT DWORD PUBLIC FLAT 'BSS'
- ALIGN 004H
- _BSS ENDS
-
- _RDATA SEGMENT DWORD PUBLIC FLAT 'DATA'
- ALIGN 004H
- _RDATA ENDS
-
- _TEXT1 SEGMENT DWORD PUBLIC FLAT 'CODE'
- ALIGN 004H
- _TEXT1 ENDS
-
- _DATA1 SEGMENT DWORD PUBLIC FLAT 'DATA'
- ALIGN 004H
- _DATA1 ENDS
-
- ASSUME CS:FLAT,DS:FLAT,SS:FLAT
- _DATA SEGMENT DWORD PUBLIC FLAT 'DATA'
- _DATA ENDS
-
-
- _TEXT SEGMENT DWORD PUBLIC FLAT 'CODE'
- ALIGN 4
- PUBLIC @digLen@4
-
- @digLen@4 PROC NEAR
- test ecx, ecx
- jne SHORT L919
- xor eax, eax
- ret
-
- L919:
- bsr eax,ecx
- jmp DWORD PTR JTAB_1004[eax*4]
-
- L_012:
- mov eax, 1
- ret
-
- L_3:
- cmp ecx, 10
- sbb eax, eax
- add eax, 2
- ret
-
- L_45:
- mov eax, 2
- ret
-
- L_6:
- cmp ecx, 100
- sbb eax, eax
- add eax, 3
- ret
-
- L_78:
- mov eax, 3
- ret
-
- L_9:
- cmp ecx, 1000
- sbb eax, eax
- add eax, 4
- ret
-
- L936:
- mov eax, 4
- ret
-
- L938:
- cmp ecx, 10000
- sbb eax, eax
- add eax, 5
- ret
-
- L940:
- mov eax, 5
- ret
-
- L942:
- cmp ecx, 100000
- sbb eax, eax
- add eax, 6
- ret
-
- L944:
- mov eax, 6
- ret
-
- L946:
- cmp ecx, 1000000
- sbb eax, eax
- add eax, 7
- ret
-
- L948:
- mov eax, 7
- ret
-
- L950:
- cmp ecx, 10000000
- sbb eax, eax
- add eax, 8
- ret
- L952:
- mov eax, 8
- ret
-
- L954:
- cmp ecx, 100000000
- sbb eax, eax
- add eax, 9
- ret
-
- L956:
- mov eax, 9
- ret
-
- L958:
- cmp ecx, 1000000000
- sbb eax, eax
- add eax, 10
- ret
-
- L960:
- mov eax, 10
- ret
-
- align 4
- JTAB_1004:
- DD L_012 ;0
- DD L_012 ;1
- DD L_012 ;2
-
- DD L_3 ;3
-
- DD L_45 ;4
- DD L_45 ;5
-
- DD L_6 ;6
-
- DD L_78 ;7
- DD L_78 ;8
-
- DD L_9 ;9
-
- DD L936 ;10
- DD L936 ;11
- DD L936 ;12
-
- DD L938 ;13
-
- DD L940 ;14
- DD L940 ;15
-
- DD L942 ;16
-
- DD L944 ;17
- DD L944 ;18
-
- DD L946 ;19
-
- DD L948 ;20
- DD L948 ;21
- DD L948 ;22
-
-
- DD L950 ;23
-
- DD L952 ;24
- DD L952 ;25
-
- DD L954 ;26
-
- DD L956 ;27
- DD L956 ;28
-
- DD L958 ;29
-
- DD L960 ;30
- DD L960 ;31
- ret 0
-
- @digLen@4 ENDP
- _TEXT ENDS
- END
复制代码 |
|